Перейти к основному содержимому
Версия: 2.0

OpenCTI

Интеграция с OpenCTI

Данное руководство описывает быструю настройку интеграции Solar TI Feeds Agent с OpenCTI для автоматической загрузки индикаторов компрометации (IoC).


Предварительные требования

  • Установленный и настроенный Solar TI Feeds Agent
  • Действительный JWT-токен для доступа к Solar TI Feeds API
  • Учётные данные для доступа к OpenCTI API (JWT-аутентификация)

Конфигурация интеграции

Интеграция автоматизирует выгрузку индикаторов из Solar TI Feeds в OpenCTI. Для подключения к системе используется аутентификация типа JwtAuth.

Основные компоненты интеграции:

КомпонентНазначение
FeedsAPIGeneratorЗагрузка данных из Solar TI Feeds API
FeedsDBSinkСохранение данных в локальную SQLite-базу
FeedsDBGeneratorЧтение данных из базы для обработки
FeedsFailedDBGeneratorПовторная обработка ошибочных записей
OpenCTISinkОтправка данных в OpenCTI через API

Переменные окружения

Для работы интеграции необходимо определить следующие переменные окружения в файле docker-compose.yml:

ПеременнаяНазначениеЗначение по умолчанию
TIC_AGENT_OPENCTI_ADDRESSURL-адрес сервера OpenCTI API-
TIC_AGENT_OPENCTI_TOKENJWT-токен для аутентификации в OpenCTI-
TIC_AGENT_OPENCTI_TLPУровень TLP: red, amber, green, whitered
TIC_AGENT_OPENCTI_TYPEТип сущности: indicator или observedindicator
TIC_AGENT_OPENCTI_API_VERSIONВерсия API: 6 или 77
TIC_AGENT_OPENCTI_PROXYСтрока подключения к прокси-серверу для OpenCTI (например, socks5://user:password@proxy.domain:port)-

Структура pipeline для OpenCTI

В актуальной версии конфигурации используется один комплексный pipeline, а не отдельные pipeline для каждого фида. Pipeline состоит из двух частей:

Pipeline 1: feeds-api (загрузка данных)

КомпонентПараметрыОписание
FeedsAPIGeneratorname = "feeds-api-generator"Запрос данных из Solar TI Feeds API с настраиваемыми интервалом и размером пакета. Запрашиваются все поля (fields = "all").
server = templates.TICApiCfg (адрес и токен из TIC_AGENT_API_URL / TIC_AGENT_API_TOKEN)
schedule = (read?("env:TIC_AGENT_API_POOL_INTERVAL") ?? 3600).toInt().s
filter.pagination.limit = (read?("env:TIC_AGENT_API_BATCH_SIZE") ?? 1000).toInt()
FeedsDBSinkname = "feeds-db-sink"
inputs = ["feeds-api-generator"]
Сохранение всех полученных данных в SQLite-базу для последующей обработки.

Pipeline 2: open-cti (обработка и выгрузка)

КомпонентПараметрыОписание
FeedsDBGeneratorname = "open-cti-feeds-db-generator"Чтение индикаторов из БД с настраиваемыми интервалом, задержкой и размером пакета.
schedule = (read?("env:TIC_AGENT_DB_POOL_INTERVAL") ?? 600).toInt().s
delay = (read?("env:TIC_AGENT_DB_START_DELAY") ?? 60).toInt().s
batchSize = (read?("env:TIC_AGENT_DB_BATCH_SIZE") ?? 100).toInt()
batchDelay = (read?("env:TIC_AGENT_DB_BATCH_DELAY") ?? 100).toInt().ms
FeedsFailedDBGeneratorname = "open-cti-feeds-db-failed-generator"Повторная обработка индикаторов, отправка которых ранее завершилась ошибкой. Привязан к основному генератору через feedGenName. Параметры schedule и delay не задаются – используются значения по умолчанию, заданные в компоненте.
feedGenName = "open-cti-feeds-db-generator"
OpenCTISinkname = "open-cti-sink"Отправка подготовленных индикаторов в OpenCTI. Аутентификация – JWT. Поддерживается прокси. Параметры vendor, vendorId, connectorId, support используются со значениями по умолчанию.
inputs = ["open-cti-feeds-db-generator", "open-cti-feeds-db-failed-generator"]
server = new agent.ServerCfg {
  address = read("env:TIC_AGENT_OPENCTI_ADDRESS")
  credentials = new agent.JwtAuth {
    token = read("env:TIC_AGENT_OPENCTI_TOKEN")
  }
  proxy = read?("env:TIC_AGENT_OPENCTI_PROXY")
}
tlpLevel = (read?("env:TIC_AGENT_OPENCTI_TLP") ?? "red") as agent.OpenCTILevel
type = (read?("env:TIC_AGENT_OPENCTI_TYPE") ?? "indicator") as agent.OpenCTIType
apiVersion = (read?("env:TIC_AGENT_OPENCTI_API_VERSION") ?? "7") as agent.OpenCTIAPIVersion
idleTO = 30.min

Справочник параметров для OpenCTI

Параметры ServerCfg (подключение к OpenCTI)

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписаниеПример
credentialsJwtAuthnew NoAuth ДаДанные для аутентификацииcredentials = new JwtAuth token = read("env:TIC_AGENT_OPENCTI_TOKEN")
addressAddressДаURL-адрес сервера OpenCTI APIaddress = "https://opencti.example.com:4000"
timeoutDuration1.minНетТаймаут запросовtimeout = 120.s
retriesInt5НетКоличество повторных попытокretries = 3
retryTimeoutDuration10.sНетНачальная задержка между попыткамиretryTimeout = 5.s
retryMaxTimeoutDuration50.sНетМаксимальная задержка между попыткамиretryMaxTimeout = 30.s
insecureSkipVerifyBooleanfalseНетОтключение проверки SSL-сертификатаinsecureSkipVerify = true
proxyStringnullНетПрокси-сервер для подключенияproxy = "http://proxy.example.com:8080"

Параметры OpenCTISink

ПараметрТип данныхЗначение по умолчаниюОбязательностьОписание
serverServerCfgДаКонфигурация подключения к серверу OpenCTI
vendorString"Solar"НетИмя вендора
vendorIdString"bd38130d-9bfb-426a-8c3b-ecc46e92ff83"НетИдентификатор вендора в OpenCTI
connectorIdString"cf0c51c7-5580-4511-8787-a6d569e78ef7"НетИдентификатор коннектора в OpenCTI
supportString"support.tic@solar-rt.ru"НетАдрес поддержки
tlpLevelOpenCTILevelДаУровень TLP: red, amber, green, white
typeOpenCTITypeДаТип сущности: indicator или observed
apiVersionOpenCTIAPIVersion"7"НетВерсия API OpenCTI: 6 или 7
idleTODuration30.min (в данной конфигурации)НетТаймаут бездействия перед закрытием соединения

Доступные уровни TLP

ЗначениеОписание
redИнформация предназначена только для конкретных получателей
amberИнформация может распространяться только внутри организации
greenИнформация может распространяться внутри сообщества
whiteИнформация может распространяться неограниченно

Доступные типы сущностей

ЗначениеОписание
indicatorИндикатор компрометации (STIX Indicator)
observedНаблюдаемая сущность (STIX Observed Data)

Полный код конфигурационного файла для интеграции с OpenCTI

📄 Нажмите, чтобы показать/скрыть opencti_pipeline.pkl
amends "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/Pipelaner.pkl"
import "package://pkg.pkl-lang.org/github.com/pipelane/pipelaner/pipelaner@1.3.1#/source/Components.pkl"
import "../pkl/internal/agent.pkl"
import "../pkl/internal/templates.pkl"

pipelines {
new Components.Pipeline {
name = "feeds-api"
inputs {
new agent.FeedsAPIGenerator {
name = "feeds-api-generator"
server = templates.TICApiCfg
schedule = (read?("env:TIC_AGENT_API_POOL_INTERVAL") ?? 3600).toInt().s
filter = new agent.FeedsAPIRequestParams {
fields = new Listing {
"all"
}
pagination = new agent.Pagination {
limit = (read?("env:TIC_AGENT_API_BATCH_SIZE") ?? 1000).toInt()
}
}
}
}
sinks {
new agent.FeedsDBSink {
name = "feeds-db-sink"
inputs {
"feeds-api-generator"
}
}
}
}

new Components.Pipeline {
name = "open-cti"
inputs {
new agent.FeedsDBGenerator {
name = "open-cti-feeds-db-generator"
schedule = (read?("env:TIC_AGENT_DB_POOL_INTERVAL") ?? 600).toInt().s
delay = (read?("env:TIC_AGENT_DB_START_DELAY") ?? 60).toInt().s
batchSize = (read?("env:TIC_AGENT_DB_BATCH_SIZE") ?? 100).toInt()
batchDelay = (read?("env:TIC_AGENT_DB_BATCH_DELAY") ?? 100).toInt().ms
}
new agent.FeedsDBFailedGenerator {
name = "open-cti-feeds-db-failed-generator"
feedGenName = "open-cti-feeds-db-generator"
}
}
sinks {
new agent.OpenCTISink {
name = "open-cti-sink"
inputs {
"open-cti-feeds-db-generator"
"open-cti-feeds-db-failed-generator"
}
server = new agent.ServerCfg {
address = read("env:TIC_AGENT_OPENCTI_ADDRESS")
credentials = new agent.JwtAuth {
token = read("env:TIC_AGENT_OPENCTI_TOKEN")
}
proxy = read?("env:TIC_AGENT_OPENCTI_PROXY")
}
tlpLevel = (read?("env:TIC_AGENT_OPENCTI_TLP") ?? "red") as agent.OpenCTILevel
type = (read?("env:TIC_AGENT_OPENCTI_TYPE") ?? "indicator") as agent.OpenCTIType
apiVersion = (read?("env:TIC_AGENT_OPENCTI_API_VERSION") ?? "7") as agent.OpenCTIAPIVersion
idleTO = 30.min
}
}
}
}

settings = templates.baseSettings

Мониторинг результатов работы интеграции

После запуска агента убедитесь в корректности работы интеграции:

ПроверкаДействие
Проверка логов агентаПросмотрите логи в директории ./workdir/logs на наличие ошибок или предупреждений
Верификация в OpenCTIВ интерфейсе OpenCTI перейдите в раздел Indicators и убедитесь, что индикаторы загружаются с указанным вендором "Solar"
Проверка TLP уровняВ карточке индикатора проверьте, что установлен корректный уровень TLP
Проверка типа сущностиУбедитесь, что индикаторы создаются с правильным типом (indicator или observed)

Примечание: Логи агента также можно просмотреть в реальном времени с помощью команды docker logs {CONTAINER_NAME}.